﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Entidad;
using System.Data;
using System.Data.SqlClient;

namespace DAO
{
    public class InformeQueryDAO : InformeRestauracionInterface
    {
        private DAO_v2 dao;
        public DataView ObtenerInforme()
        {
            dao = new DAO_v2();
            SqlConnection con = new SqlConnection(DAO_v2.MiCadenaConexion());
            try
            {
                con.Open();
                SqlCommand cmd = new SqlCommand();
                String consulta = "SELECT ";
                consulta += "ej.codigo AS Codigo, ";
                consulta += "es.nombre AS Estado, ";
                consulta += "ron.costo AS Costo, ";
                consulta += "l.titulo AS Titulo, ";
                consulta += "ron.fechaEntrega AS FechaEntrega, ";
                consulta += "ror.cuil AS CUIL, ";
                consulta += "ron.numero AS Numero, ";
                consulta += "(p.apellido + ', ' + p.nombre) AS ApellidoNombre ";
                consulta += "FROM ";
                consulta += "Ejemplar ej LEFT JOIN Estado es ON es.id_Estado = ej.id_Estado ";
                consulta += "LEFT JOIN Libro l ON l.id_Libro = ej.id_Libro ";
                consulta += "RIGHT JOIN Restauracion ron ON ron.id_Ejemplar = ej.id_Ejemplar ";
                consulta += "LEFT JOIN Restaurador ror ON ror.id_Restaurador = ron.id_Restaurador ";
                consulta += "LEFT JOIN Persona p ON p.id_Persona = ror.id_Persona ";
                consulta += "WHERE 1 = 1 ";
                cmd.CommandText = consulta;
                cmd.Connection = con;
                DataTable dt = new DataTable();
                dt.Load(cmd.ExecuteReader());
                DataView dv = new DataView(dt);
                return dv;
            }
            catch (SqlException ex)
            {
                return null;
                throw new ApplicationException("Error al obtener el InformeQuery...");
            }
            finally
            {
                dao.CerrarConexion(con);
            }
        }

        public DataView ObtenerInforme(String filtros)
        {
            dao = new DAO_v2();
            SqlConnection con = new SqlConnection(DAO_v2.MiCadenaConexion());
            try
            {
                con.Open();
                SqlCommand cmd = new SqlCommand();
                String consulta = "SELECT ";
                consulta += "ej.codigo AS Codigo, ";
                consulta += "es.nombre AS Estado, ";
                consulta += "ron.costo AS Costo, ";
                consulta += "l.titulo AS Titulo, ";
                consulta += "ron.fechaEntrega AS FechaEntrega, ";
                consulta += "ror.cuil AS CUIL, ";
                consulta += "ron.numero AS Numero, ";
                consulta += "(p.apellido + ', ' + p.nombre) AS ApellidoNombre ";
                consulta += "FROM ";
                consulta += "Ejemplar ej LEFT JOIN Estado es ON es.id_Estado = ej.id_Estado ";
                consulta += "LEFT JOIN Libro l ON l.id_Libro = ej.id_Libro ";
                consulta += "RIGHT JOIN Restauracion ron ON ron.id_Ejemplar = ej.id_Ejemplar ";
                consulta += "LEFT JOIN Restaurador ror ON ror.id_Restaurador = ron.id_Restaurador ";
                consulta += "LEFT JOIN Persona p ON p.id_Persona = ror.id_Persona ";
                consulta += "WHERE 1 = 1 ";
                consulta += filtros;
                cmd.CommandText = consulta;
                cmd.Connection = con;
                DataTable dt = new DataTable();
                dt.Load(cmd.ExecuteReader());
                DataView dv = new DataView(dt);
                return dv;
            }
            catch (SqlException ex)
            {
                return null;
                throw new ApplicationException("Error al obtener el InformeQuery...");
            }
            finally
            {
                dao.CerrarConexion(con);
            }
        }

        public String OtenerFechaMasAntigua()
        {
            dao = new DAO_v2();
            SqlConnection con = new SqlConnection(DAO_v2.MiCadenaConexion());
            try
            {
                con.Open();
                SqlCommand cmd = new SqlCommand();
                String consulta = "SELECT Restauracion.fechaEntrega AS FechaEntrega ";
                consulta += "FROM ";
                consulta += "Libro LEFT JOIN Ejemplar ON Ejemplar.id_Libro = Libro.id_Libro ";
                consulta += "RIGHT JOIN Restauracion ON Restauracion.id_Ejemplar = Ejemplar.id_Ejemplar ";
                consulta += "ORDER BY FechaEntrega ASC ";
                //List<String> tablas = new List<String>();
                //List<String> columnas = new List<String>();
                //List<String> fk = new List<String>();
                //List<String> pk = new List<String>();
                //tablas.Add("Libro");
                //tablas.Add("Ejemplar");
                //tablas.Add("Restauracion");
                //tablas.Add("Restaurador");
                //tablas.Add("Estado");
                //tablas.Add("Persona");
                //columnas.Add("Restauracion.fechaEntrega as 'FechaEntrega'");
                //fk.Add("Ejemplar.id_Libro");
                //pk.Add("Libro.id_Libro");
                //fk.Add("Ejemplar.id_Estado");
                //pk.Add("Estado.id_Estado");
                //fk.Add("Restauracion.id_Ejemplar");
                //pk.Add("Ejemplar.id_Ejemplar");
                //fk.Add("Restauracion.id_Restaurador");
                //pk.Add("Restaurador.id_Restaurador");
                //fk.Add("Restaurador.id_Persona");
                //pk.Add("Persona.id_Persona ORDER BY 'FechaEntrega' ASC");
                //SqlCommand cmd = dao.BuscarVariasTablasSinFiltro(tablas, columnas, fk, pk);
                cmd.CommandText = consulta;
                cmd.Connection = con;
                String resultado = ((DateTime)cmd.ExecuteScalar()).ToShortDateString();
                return resultado;
            }
            catch (SqlException ex)
            {
                return null;
                throw new ApplicationException("Error al obtener la fecha mas antigua...");
            }
            finally
            {
                dao.CerrarConexion(con);
            }
        }
        public DataView BuscarRestauradores(long? cuil)
        {
            throw new NotImplementedException();
        }

        public List<EjemplarEnt> BuscarEjemplares(int? codigo)
        {
            throw new NotImplementedException();
        }

    }
}
